// 📁 service/BorrowService.java
package com.library.management.service;

import com.library.management.entity.BorrowRecord;
import com.library.management.enums.BorrowStatus;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 借阅服务接口
 * 处理借阅相关的业务逻辑
 */
public interface BorrowService extends BaseService<BorrowRecord, Long> {

    /**
     * 借书操作
     */
    BorrowRecord borrowBook(Long userId, Long bookId, LocalDateTime borrowDate, LocalDateTime dueDate);

    /**
     * 还书操作
     */
    BorrowRecord returnBook(Long borrowRecordId, LocalDateTime returnDate);

    /**
     * 续借操作
     */
    BorrowRecord renewBook(Long borrowRecordId, int renewDays);

    /**
     * 根据用户查找借阅记录
     */
    List<BorrowRecord> findByUserId(Long userId);

    /**
     * 根据图书查找借阅记录
     */
    List<BorrowRecord> findByBookId(Long bookId);

    /**
     * 根据状态查找借阅记录
     */
    List<BorrowRecord> findByStatus(BorrowStatus status);

    /**
     * 查找当前借阅中的记录（包括借阅中、逾期、已续借）
     */
    List<BorrowRecord> findCurrentBorrowRecords();

    /**
     * 查找已逾期的借阅记录
     */
    List<BorrowRecord> findOverdueRecords();

    /**
     * 查找即将到期的借阅记录（在指定天数内到期）
     */
    List<BorrowRecord> findDueSoonRecords(int days);

    /**
     * 分页查询用户的借阅记录
     */
    Page<BorrowRecord> findByUserId(Long userId, Pageable pageable);

    /**
     * 检查用户是否已借阅某本图书且未归还
     */
    boolean isBookBorrowedByUser(Long userId, Long bookId);

    /**
     * 获取用户当前借阅数量
     */
    long getCurrentBorrowCountByUser(Long userId);

    /**
     * 统计借阅次数
     */
    long countBorrowsByUser(Long userId);

    /**
     * 统计图书的被借阅次数
     */
    long countBorrowsByBook(Long bookId);

    /**
     * 计算逾期天数并更新记录
     */
    void calculateAndUpdateOverdue(Long borrowRecordId);

    /**
     * 批量计算逾期天数并更新记录
     */
    void batchCalculateAndUpdateOverdue();

    /**
     * 检查是否可以续借
     */
    boolean canRenew(Long borrowRecordId, int maxRenewTimes);

    /**
     * 获取借阅记录详情
     */
    BorrowRecord getBorrowRecordDetail(Long borrowRecordId);

    /**
     * 查找指定天数内的借阅记录
     */
    List<BorrowRecord> findBorrowsInLastDays(int days);

    /**
     * 统计逾期记录数量
     */
    long countOverdueRecords();
}